import os
from datetime import timedelta


# /**
#  * 作者: "test_LH"
#  * 日期: 2025-10-11
#  * 名称: Config
#  * 作用: 提供生产与开发环境通用的 Flask 应用配置
#  * 参数:
#  *   @param 无 无
#  * 返回: 无
#  * 备注: 供 create_app 加载使用
#  */
class Config:
    SQLALCHEMY_DATABASE_URI = os.getenv(
        "DATABASE_URL",
        "sqlite:///" + os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "app.db")),
    )  # 数据库连接 URI，默认使用项目根目录下的 SQLite 文件
    SQLALCHEMY_TRACK_MODIFICATIONS = False  # 关闭 SQLAlchemy 修改跟踪以减少开销

    SECRET_KEY = os.getenv("SECRET_KEY", "change-me")  # Flask 会话加密密钥，部署时需替换
    SECURITY_PASSWORD_SALT = os.getenv("SECURITY_PASSWORD_SALT", "change-this-salt")  # Flask-Security 密码盐值
    SECURITY_PASSWORD_HASH = os.getenv("SECURITY_PASSWORD_HASH", "bcrypt")  # 指定密码散列算法
    SECURITY_REGISTERABLE = True  # 允许通过 API 注册新用户
    SECURITY_SEND_REGISTER_EMAIL = False  # 禁用注册邮件发送，避免本地开发依赖邮件服务
    SECURITY_RECOVERABLE = True  # 启用密码找回功能
    SECURITY_PASSWORDLESS = False  # 关闭免密登录流程
    SECURITY_UNIFIED_SIGNIN = False  # 关闭统一登录入口，沿用独立登录接口

    JWT_SECRET_KEY = os.getenv("JWT_SECRET_KEY", "change-this-jwt-secret")  # JWT 签发密钥，部署时需保证唯一
    JWT_ACCESS_TOKEN_EXPIRES = timedelta(minutes=30)  # 访问令牌有效期，限制会话时长
    JWT_REFRESH_TOKEN_EXPIRES = timedelta(days=30)  # 刷新令牌有效期，控制长期登录策略

    RESTX_MASK_SWAGGER = False  # 禁用 Swagger 字段掩码以展示完整模型

    SECURITY_JWT_IDENTITY_CLAIM = "sub"  # 将 JWT 主体字段映射到 Flask-Security 的身份标识


# /**
#  * 作者: "test_LH"
#  * 日期: 2025-10-11
#  * 名称: TestConfig
#  * 作用: 为单元测试提供独立配置，避免污染生产数据库
#  * 参数:
#  *   @param 无 无
#  * 返回: 无
#  * 备注: 继承基础配置并覆盖部分参数
#  */
class TestConfig(Config):
    TESTING = True  # 启用 Flask 测试模式，提供更详细的错误信息
    SQLALCHEMY_DATABASE_URI = "sqlite:///:memory:"  # 测试使用内存数据库，加速用例执行
    WTF_CSRF_ENABLED = False  # 在测试环境关闭 CSRF，便于模拟请求
